home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 11243 / 11243.xpi / chrome / skipscreen.jar / content / skipscreen.js < prev    next >
Text File  |  2009-12-09  |  65KB  |  1,956 lines

  1. /* SkipScreen
  2. * Skips unnecessary pages on sites like Rapidshare, Megaupload, zShare, and Mediafire.
  3. * No more endless clicking to get the files you want.  What a relief!
  4. */
  5.  
  6. // for JsLint -- see http://www.jslint.com/lint.html
  7. /*global GM_getValue GM_log unsafeWindow XPathResult */
  8.  
  9.  
  10. // @name        SkipScreen
  11. // @namespace   http://www.SkipScreen.com
  12. // @author      Worcester LLC (for the purposes of copyright)
  13. // @developer   Michael Paulukonis
  14. // @license     see ../license.txt
  15.  
  16. // start is at the end....
  17.  
  18. /* *******************************************
  19.  
  20.  utility functions
  21.  
  22.  ******************************************* */
  23.  
  24. // aaargh! eval is evil!
  25. // but this is working, for now...
  26. //eval(jQuery);
  27. //eval(jDNR);
  28. // http://dev.iceburg.net/jquery/jqDnR/
  29. // Drag-n-Resize for jQuery
  30.  
  31.  
  32.  
  33. // declare globals
  34. var TOOLS;
  35.  
  36. // instantiated as globals TOOLS
  37. function SKIPSCREEN_TOOLS() {
  38.  
  39.     this.ONE_SECOND = 1000;
  40.  
  41.     this.minutesToSeconds = function (mins) {
  42.        return mins * 60;
  43.     };
  44.  
  45.     // returns a time-string like mm:ss
  46.     this.formatSeconds = function (secs) {
  47.        return parseInt(secs/60,10) + ":" + (secs%60 > 9 ? secs%60 : "0" + secs%60);
  48.     };
  49.  
  50.     // note +- the offset, +- half the offset
  51.     // ie, the offset is the range
  52.     this.randomOffset = function (range) {
  53.         return ( -(range/2) + Math.floor(Math.random() * (range+1)));
  54.     };
  55.  
  56.     this.getSkipCount = function () {
  57.         return GM_getValue('skipcount');
  58.     };
  59.  
  60.     this.incrSkipCount = function () {
  61.         var curr = this.getSkipCount();
  62.         curr++;
  63.         GM_setValue('skipcount', curr);
  64.     };
  65.  
  66. }
  67.  
  68. // straight-up interface, no defaults
  69. function enabled(prefName) {
  70.     return GM_getValue(prefName);
  71. }
  72.  
  73. function disabled (prefName) {
  74.     // uses the GM-compiler's built-in function, with a redefined root
  75.     var dfault = false; // this means if a pref does not exist, it's the same as disabled -- SO BUILD PREFS!
  76.  
  77.     // three-bangs = negated flag (it's a negative function name for a positive preference)
  78.     var checker = GM_getValue(prefName+'active', dfault);
  79.     return !!!checker;
  80. }
  81.  
  82. // return Name, or mask that we use as a preference, if server is known by an alias
  83. function getMask(prefName) {
  84.  
  85.     var mask = prefName;
  86.  
  87.     // all the various servers that operate for linkbucks
  88.     var linkbucksreg = /linkbucks|baberepublic|blahetc|linkgalleries|linkseer|picturesetc|placepictures|qvvo|realfiles|seriousfiles|seriousurls|thatsprime|thesefiles|thesegalleries|thosegalleries|tinybucks|uberpicz|ubervidz|ubucks|ugalleries|urlpulse|viraldatabase|youfap|zxxo/i;
  89.     if (linkbucksreg.exec(prefName)) {
  90.         mask = "linkbucks";
  91.     } else if (prefName == '4shared') {
  92.         mask = 'fourshared';
  93.     } else if (prefName.match('mega(upload|porn)')) {
  94.     mask = 'megaupload';
  95.     }
  96.  
  97.     return mask;
  98.  
  99. }
  100.  
  101. // wrapper function, for future expansion
  102. function logIt(message) {
  103.     GM_log(message);
  104. }
  105.  
  106. function pathSplit(path) {
  107.     return path.split('/');
  108. }
  109.  
  110. function stripLocation(url) {
  111.  
  112.     // ditch the protocol (eg, "http://" "https://" "gopher://")
  113.     // and the path (eg "http://sub.domain.tld/this/is/the/path.mp3")
  114.     // leaving only "sub.domain.tld" (in this case)
  115.  
  116.     // equiv. to location.hostname BUT we use this on arbitrary paths (eg, sharebee)
  117.  
  118.     var idx = url.indexOf("://")+3;
  119.     var Domain = url.substring(idx);
  120.     idx = Domain.indexOf("/");
  121.     Domain = Domain.substring(0, idx);
  122.  
  123.     return Domain;
  124.  
  125. }
  126.  
  127. // given a valid URL, return the hostname as an array
  128. // http://jim.dandy.org/path/to/something.zip -> ['jim','dandy','org']
  129. function domainToArray (url) {
  130.  
  131.     var sDomain = stripLocation(url);
  132.     var aDomain = [];
  133.     aDomain = sDomain.split('.');
  134.  
  135.     return aDomain;
  136.  
  137. }
  138.  
  139. // return the second-level domain name
  140. // expects an array derived from splitting domain on "."
  141. function getSecondLevelDomain(hostArray) {
  142.  
  143.     // scenarios:
  144.     // ["www", "xradiograph", "com"]
  145.     // ["www", "cs", "uofs", "edu"]
  146.     // ["localhost"]
  147.  
  148.     // as it exists, code only works for the first two scenarios;
  149.     // fails for third
  150.  
  151.     // TODO: raise a ruckus on unexpected data?
  152.     // TODO: oh, yeah -- clean this up. ugh.
  153.     var mainDomain;
  154.  
  155.     return hostArray[hostArray.length-2].toLowerCase();
  156. }
  157.  
  158. // eg "com" "org" "to"
  159. function getTLD(url) {
  160.     // return the top-level domain of supplied url
  161.     // expects an array derived from splitting domain on "."
  162.  
  163.     return url[url.length-1].toLowerCase();
  164. }
  165.  
  166.  
  167. function $id(id) {
  168.     var elem;
  169.     try {
  170.         elem = document.getElementById(id);
  171.     } catch(e) {}
  172.     return elem;
  173. }
  174.  
  175. // wrapper for getFirstResult - like the FireBug command-line, except only a single elem. returned
  176. function $x1(expr) {
  177.     return getFirstResult(expr, document);
  178. }
  179.  
  180. // wrapper for getFirstResult - like the FireBug command-line, except only a single elem. returned
  181. function $x(expr) {
  182.     return getXpathResult(expr, document);
  183. }
  184.  
  185.  
  186. // Returns null if expr didn't match anything
  187. function getFirstResult(expr, node){
  188.     // if no node provided, default to document
  189.     if (!node) {node = document;}
  190.     var result = document.evaluate(expr, node, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
  191.     return result.singleNodeValue;
  192. }
  193.  
  194. // Returns null if expr didn't match anything
  195. function getXpathResult(expr, node){
  196.     // if no node provided, default to document
  197.     if (!node) {node = document;}
  198.     var result = document.evaluate(expr, node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  199.     return result;
  200. }
  201.  
  202.  
  203.  
  204. // "creates" elemenent with supplied attributes
  205. function makeElement(type, attributes){
  206.     var node = document.createElement(type);
  207.     for (var attr in attributes) if (attributes.hasOwnProperty(attr)){
  208.         node.setAttribute(attr, attributes[attr]);
  209.     }
  210.     return node;
  211. }
  212.  
  213.  
  214. function addHeaderCode(element, type, code, attributes) {
  215.  
  216.     var custElm;
  217.  
  218.     custElm = makeElement(element, attributes);
  219.     if (type) {custElm.type = type;}
  220.     custElm.innerHTML = code;
  221.  
  222.     document.getElementsByTagName('head')[0].appendChild(custElm);
  223.  
  224. }
  225.  
  226. // TODO: it's an action with a noun's name. ouch.
  227. function errorHandler(error, site) {
  228.  
  229.     if (!site) { site = ""; }
  230.  
  231.     var msg = "SkipScreen -  " + site + " generated error:\n\n" + error;
  232.     if (enabled("errordisplay")) { alert(msg); }
  233.     logIt(msg);
  234.  
  235.     // http://www.xs4all.nl/~jlpoutre/BoT/Greasemonkey/gm_openintab.html
  236.     // open messages in a new tab for info....
  237.     //GM_openInTab("data:text/plain;charset=UTF-8," + encodeURI(smsg);
  238.  
  239.  
  240. }
  241.  
  242. function prominence(msg) {
  243.  
  244.     // create main div
  245.     var prom = makeElement('div', {id: "prom", 'class': 'prom' });
  246.     var anchor = makeElement('a', {href: "#", title: "close (does not cancel download)", 'class': 'closer' });
  247.     anchor.innerHTML = "x";
  248.  
  249.     var remover = function () {document.getElementById('prom').style.display = "none"; };
  250.     anchor.addEventListener('click', remover, false);
  251.  
  252.     var cont = makeElement("div", {'id': 'prom-content'});
  253.     cont.innerHTML = msg;
  254.  
  255.     prom.appendChild(anchor);
  256.     prom.appendChild(cont);
  257.  
  258.     // Append Divs
  259.     var objBody = document.getElementsByTagName("body")[0];
  260.     // exit if no body -- some weird errors...
  261.     if (objBody) {objBody.appendChild(prom);}
  262.  
  263.     // if jquery Drag-n-Resize exists, use it
  264.     if (typeof jQuery != 'undefined') $('#prom').jqDrag();
  265.  
  266.      var prominentCSS = '.prom {'
  267.         + 'position: fixed;'
  268.         + 'z-index: 9999999;'
  269.         + 'top: 50%;'
  270.         + 'left: 50%;'
  271.         + 'margin-top: -100px;'
  272.         + 'margin-left: -150px;'
  273.         + 'width: 300px;'
  274.         + 'height: 200px;'
  275.         + 'background: #C8FFCA;'
  276.         + 'opacity: 0.9;'
  277.         + 'color: #008000;'
  278.         + 'border: 10px solid #349534;'
  279.         + 'text-align: center;'
  280.         + 'font-size: 14px;'
  281.         + 'font-family: verdana;'
  282.         + '}'
  283.  
  284.         + '.prom-auto {'
  285.         + 'color: #349534;'
  286.         + 'font-weight: bold;'
  287.         + '}'
  288.  
  289.         + '.prom-host {'
  290.         + 'color: red;'
  291.         + '}'
  292.  
  293.         + '#prom-content {'
  294.         + 'padding: 10px;'
  295.         + '}'
  296.  
  297.         + '.prom p {'
  298.         + 'margin: 0;'
  299.         + 'padding: 5px 10px; '
  300.         + 'text-align: center;'
  301.         + '}\n'
  302.  
  303.         + '.prom a {'
  304.         + 'color: #000;'
  305.         + '}\n'
  306.  
  307.         + '.prom a.closer {'
  308.         + 'float: right;'
  309.         + 'text-decoration: none;'
  310.         + 'font-weight: bold;'
  311.         + 'color: #fff;'
  312.         + 'background-color: #000;'
  313.         + 'border-left: 1px solid #333;'
  314.         + 'border-bottom: 1px solid #333;'
  315.         + 'line-height: 9px;'
  316.         + 'padding: 0 2px 1px;'
  317.         + 'margin-left: 2px; }';
  318.  
  319.     addHeaderCode('style', 'text/css', prominentCSS);
  320.  
  321. } // end prominence
  322.  
  323.  
  324. // TODO: optionally use pre-exisiting timer... eg, don't double-display
  325. function genericWaiter(seconds, gwHostStr, endFunction) {
  326.  
  327.     var msg = "<p class='prom-host'>"+ gwHostStr + " is making you wait.</p>"
  328.         + "<p class='prom-auto'>SkipScreen will automatically retry when the timer finishes.</p>"
  329.         + "<p id='remaining'>Preparing to skip</p>";
  330.  
  331.     prominence(msg);
  332.  
  333.     // NOTE: as this is added to the page
  334.     // TOOLS and $id needed to be added to the namespace, as well...
  335.     var waiter = setInterval( function() {
  336.         --seconds;
  337.         if (seconds <= 0) {
  338.             clearInterval(waiter);
  339.             document.title = "{SS} Download started!";
  340.             var r = $id("remaining");
  341.             if (r) r.innerHTML = "<p style='color: blue'>Download started!</p>";
  342.             endFunction();
  343.         } else {
  344.             var msg = TOOLS.formatSeconds(seconds) + " remaining";
  345.             document.title = "{SS} "+ msg + " (" + gwHostStr + ")";
  346.             var rem = $id("remaining");
  347.             if (rem) rem.innerHTML = msg;
  348.         }
  349.     }
  350.                               , TOOLS.ONE_SECOND );
  351. } // end genericWaiter
  352.  
  353.  
  354.  
  355. /* *******************************************
  356.  
  357.  Client functions
  358.  
  359.  ******************************************* */
  360.  
  361. // added Nov 2009
  362. function filestube() {
  363.  
  364.     //var dl = $x('//tr/td[1]/a');
  365.     var dl = $x('//div[3]/table/tbody/tr/td[1]/a');
  366.     // aaargh, THIS version never happens....
  367.     if (dl && dl.href) {
  368.     document.location.href = dl.href;
  369.     return;
  370.     }
  371.     if (dl && (dl.snapshotLength > 0)) {
  372.     // if length is 1, use the replace location method (single-part download)
  373.     var length = dl.snapshotLength;
  374.     if (length == 1) {
  375.         document.location.href = dl.snapshotItem(0).href;
  376.     } else {
  377.         if (!enabled("filestube_multi_active")) length = 1; //limit to the first entry for CPU usage throttle
  378.         // multi-part files, open in sep tabs
  379.         for (var i = 0; i < length; i++) {
  380.         var loc = dl.snapshotItem(i).href;
  381.         if (loc) {
  382.             //alert(i + "\n" + loc);
  383.             GM_openInTab(loc);
  384.             }
  385.         }
  386.     }
  387.     // now, we're left with an orphan window. dang.
  388.     }
  389.  
  390.     // filestube doesn't have a ShareScreen ending, becuase it's an intermediary....
  391.  
  392. }
  393.  
  394.  
  395. // added Sept 2009
  396. function netload() {
  397.  
  398.     return; // disabled for 0.3.20091108 release
  399.  
  400.     unsafeWindow.popunder = {};
  401.  
  402.     var postC = $x1("//div[@id='changeDiv']/b");
  403.     if (postC && postC.innerHTML && (postC.innerHTML.indexOf("We will prepare your download") > -1) ) {
  404.  
  405.         var wait = 20; // default
  406.         var s = $x1("//div[@id='changeDiv']/script");
  407.  
  408.         if (s && s.innerHTML & s.innerHTML.indexOf("countdown(") > -1) {
  409.             //wait = (parseInt(s.innerHTML.match(/countdown\((\d+),/)[1], 10) / 100 ) + TOOLS.randomOffset(10);
  410.             wait = 25;
  411.         }
  412.  
  413.         var endFunction = function () {
  414.             // post-captcha
  415.             alert("here");
  416.             var pcLink = $x1("id('download')/div/a");
  417.             if (pcLink) { location.href = pcLink.href; }
  418.         };
  419.         genericWaiter(wait, twoLD, endFunction);
  420.         return;
  421.     }
  422.  
  423.     var downloadLink = getFirstResult("//div[@class='dl_first_btn2']/div/a");
  424.     if (downloadLink) { // pre-captch
  425.         var newL = downloadLink.href;
  426.         location.href = newL;
  427.         // TODO: the next is an inaccurate condition -- it is true on _several_ pages
  428.         // additionally, the timers are not in synch.
  429.     } else if (unsafeWindow.countdown ) { //captcha -- and other pages
  430.  
  431.         var pMsg = "<div style='background-color: white;'><p style='color:red'>NetLoad is making you wait.</p>"
  432.             + "<p style='color:green'><strong>SkipScreen should position you in the captcha-field when the timer finishes.</strong></p>"
  433.             + "</div>";
  434.         prominence(pMsg);
  435.         var seconds = 38;
  436.  
  437.         var waiter = setInterval( function() {
  438.             seconds--;
  439.             if (seconds <= 0) {
  440.                 clearInterval(waiter);
  441.                 var c = $x1("//input[@class='Download_Captcha']");
  442.                 if (c) c.focus();
  443.                 var prom = $id("prom");
  444.                 if (prom) prom.style.display = "none";
  445.             }
  446.         } , 1000 );
  447.  
  448.     }
  449.  
  450. }
  451.  
  452. function fourshared () {
  453.  
  454.     var site = "4Shared";
  455.  
  456.     unsafeWindow.fcwait = function() {};
  457.  
  458.     var downloadNow = $x1("//a[contains(.,'Download Now')]");
  459.     var clickHereToDownload = $x1("id('divDLStart')/a");
  460.  
  461.     //check if at stage 1
  462.     if (downloadNow && downloadNow.href) {
  463.  
  464.         if (disabled("fourshared_audio_")) { // if audio _skipping_ is disabled
  465.             var text = $id("contact-message");
  466.             if (text) {
  467.                 text.innerHTML = "Audio Preview enabled; click 'Download Now' to download (or goto Options to skip).";
  468.             }
  469.         } else {
  470.             //goto stage 2
  471.             location.href = downloadNow.href;
  472.         }
  473.     }
  474.  
  475.     // handle stage2
  476.     if (clickHereToDownload) {
  477.         // TODO: better try/catch block? not purely safe, these....
  478.         try {
  479.         TOOLS.incrSkipCount(); // optimisitc!
  480.             var cntr = document.createElement("script");
  481.         document.body.appendChild(cntr).innerHTML = "function getCount() { return " + TOOLS.getSkipCount() + ";}";
  482.  
  483.             var dlLink = $x1("id('divDLStart')/a").href;
  484.             var seconds = parseInt($id("downloadDelayTimeSec").innerHTML);
  485.             var hostMessage = "4Shared requires you to wait";
  486.             var endFunction = function(){ new share().show(); location.href = dlLink; };
  487.             genericWaiter(seconds, hostMessage, endFunction);
  488.         } catch (e) {
  489.             errorHandler(e, twoLD);
  490.         }
  491.     }
  492.  
  493. } // end fourshared
  494.  
  495.  
  496. function storage () {
  497.  
  498.     //gets rid of popup but not needed with script
  499.     unsafeWindow.popunder = function() {};
  500.  
  501.      // pass in STATE and LINK
  502.     function parseJSONObj(state, countdown, link){
  503.  
  504.         var tp = 'ct';
  505.  
  506.         function skipstore(time) {
  507.  
  508.             var ssMsg = "<p style='color:red'>STORAGE.to is making you wait.</p>"
  509.                 + "<p style='color:green'><strong>SkipScreen will automatically retry when the timer finishes.</strong></p>"
  510.                 + "<p id='remaining'>Preparing to skip</p>";
  511.             prominence(ssMsg);
  512.  
  513.         TOOLS.incrSkipCount(); // optimistic!
  514.             var cntr = document.createElement("script");
  515.         document.body.appendChild(cntr).innerHTML = "function getCount() { return " + TOOLS.getSkipCount() + ";}";
  516.         // TODO: this method still needs a way to accurately increment the skipCount
  517.  
  518.         addSharingScripts();
  519.  
  520.             var seconds = time;
  521.             var waiter = setInterval( function() {
  522.                 --seconds;
  523.                 if (seconds <= 0) {
  524.                     clearInterval(waiter);
  525.             var mg = "Preparing to Skip!";
  526.                     var rem = $id("remaining");
  527.                     if (rem) rem.innerHTML = mg;
  528.             document.title = mg;
  529.                     new share().show();
  530.                     location.href = link;
  531.                 } else {
  532.                     var msg = TOOLS.formatSeconds(seconds) + " remaining.";
  533.                     document.title = "{SS} " + msg;
  534.                     var rem = $id("remaining");
  535.                     if (rem) rem.innerHTML = msg;
  536.                 }
  537.             }
  538.               , 1000 ); // end waiter
  539.  
  540.         }
  541.  
  542.         var time;
  543.  
  544.         if (state == 'failed') {
  545.         // retry in 5 minutes
  546.             time = (60 * 5) + TOOLS.randomOffset(60);
  547.             skipstore(time);
  548.         } else if ( (state == 'wait') || (countdown > 0) ) {
  549.         var offset = TOOLS.randomOffset(10);
  550.         time = parseInt(countdown,10) + offset;
  551.             skipstore(time);
  552.         }
  553.         else if (state == 'ok') {
  554.             new share().show();
  555.             location.href = link;
  556.         }
  557.     }
  558.  
  559.     function getJSONObj(){
  560.         var linkid = location.href.substring(26,34);
  561.  
  562.         GM_xmlhttpRequest({
  563.             method: "GET",
  564.             url: "http://www.storage.to/getlink/" + linkid + "/",
  565.             headers: {
  566.                 "User-Agent": "Mozilla/5.0",            // Recommend using navigator.userAgent when possible
  567.                 "Accept": "text/xml"
  568.             },
  569.             onreadystatechange: function(req) {
  570.                 if (req.readyState != 4)
  571.                     return;
  572.  
  573.                 if (req.status != 200)
  574.                     return;
  575.  
  576.         //req.responseText will be something like
  577.         //new Object({ 'state' : 'ok',
  578.         //         'countdown' : 60,
  579.         //         'link' : 'http://80.95.157.7/558205e50d0ba3f14d81f7c3637ad3f92cb20cc2/Cornelius - Wataridori 2.mp3',
  580.         //         'linkid' : 'GehTRoYm' });
  581.  
  582.         var state, countdown, link;
  583.         var res = req.responseText.match(/'state' : '(.*?)',.*?'countdown' : (\d+).*?'link' : '(.*?)',/);
  584.         if (res.length == 4) {
  585.             state = res[1];
  586.             countdown = res[2];
  587.              link = res[3];
  588.         }
  589.         parseJSONObj(state,countdown,link);
  590.  
  591.             }
  592.         });
  593.  
  594.     }
  595.  
  596.     // start it up
  597.     getJSONObj();
  598.  
  599.  
  600. } // end storage.to
  601.  
  602.  
  603. function uploaded () {
  604.  
  605.     var submit = getFirstResult("//input[@id='download_submit']");
  606.  
  607.     if (submit) {
  608.         try {
  609.             unsafeWindow.update = function () {};
  610.             submit.disabled = false;
  611.             submit.value = "SkipScreen is working";
  612.             var form = getFirstResult("//tr[1]/td/form");
  613.  
  614.             new share().show();
  615.  
  616.             if (form) {form.submit();}
  617.  
  618.             return;
  619.  
  620.         }
  621.         catch (e) { errorHandler(e, twoLD); }
  622.     }
  623.  
  624.  
  625.     var limit = getFirstResult("//center/div");
  626.  
  627.     // 1-hour delay ?
  628.     if (limit && limit.innerHTML && limit.innerHTML.indexOf("your order. (Or wait") > -1 ) {
  629.  
  630.         try {
  631.             // check for # of mins...
  632.             var wait = 0;
  633.             var time = 0;
  634.             var seconds = 0;
  635.  
  636.             var minute = limit.textContent.match(/(\d+) minute/);
  637.             if (minute && (minute.length == 2) ) {
  638.                 time = parseInt(minute[1], 10);
  639.                 seconds = TOOLS.minutesToSeconds(time);
  640.             }
  641.  
  642.             if (!minute) {
  643.                 var secs = limit.textContent.match(/(\d+) second/);
  644.                 if (secs && (secs.length == 2) ) {
  645.                     time = parseInt(secs[1], 10);
  646.                     seconds = TOOLS.minutesToSeconds(time);
  647.                 }
  648.             }
  649.  
  650.             var allText = getFirstResult("//center/div");
  651.             var ssMsg = "<p style='color:red'>Uploaded.to is making you wait.</p>"
  652.                 + "<p><strong style='color:green'>SkipScreen will automatically retry when the timer finishes.</strong></p>"
  653.                 + "<p><em>Check out <a href='http://www.SkipScreen.com' target='_blank'>SkipScreen.com</a> "
  654.                 + "and search for something new, while we wait.</em></p>"
  655.                 + "<p id='remaining'>Waiting for you!</p>";
  656.             prominence(ssMsg);
  657.  
  658.             // handle thing, with timer
  659.             addSharingScripts();
  660.  
  661.             var waiter = setInterval( function () {
  662.                 --seconds;
  663.                 if (seconds <= 0) {
  664.                     clearInterval(waiter);
  665.                     document.location.href = document.location.href.replace("?view=error_traffic_exceeded_free&id=", "file\/");
  666.                 } else {
  667.                     var msg = TOOLS.formatSeconds(seconds) + " remaining";
  668.                     document.title = "{SS} " + msg;
  669.                     var rem = $id("remaining");
  670.                     if (rem) rem.innerHTML = msg;
  671.                 }
  672.  
  673.             } , TOOLS.ONE_SECOND ) ;
  674.  
  675.         }
  676.         catch (e) { errorHandler(e, twoLD); }
  677.  
  678.     }
  679.  
  680.     // already downloading?
  681.     if (limit && limit.innerHTML.indexOf("already downloading a file") > -1 ) {
  682.  
  683.         try {
  684.  
  685.             var allText = getFirstResult("//center/div");
  686.             var msg = "<p style='color:red'>Uploaded.to is making you wait.</p>"
  687.                 + "<p style='color:green'>SkipScreen will automatically retry when the timer finishes.</p>"
  688.                 + "<p><span id='remaining'></span></p>";
  689.             prominence(msg);
  690.  
  691.             addSharingScripts();
  692.  
  693.         // TODO: add reload period to the options
  694.             var seconds = 120 + TOOLS.randomOffset(20);
  695.  
  696.             var waiter = setInterval( function () {
  697.                 --seconds;
  698.                 if (seconds <= 0) {
  699.                     clearInterval(waiter);
  700.                     document.location.href = document.location.href.replace(/\?view=.*&id_b=/, "file/");
  701.                 } else {
  702.                   var msg = TOOLS.formatSeconds(seconds) + " remaining";
  703.                     document.title = "{SS} " + msg;
  704.                     var rem = $id("remaining");
  705.                     if (rem) rem.innerHTML = msg;
  706.                 }
  707.  
  708.             },TOOLS.ONE_SECOND ) ;
  709.         }
  710.         catch (e) { errorHandler(e, twoLD); }
  711.  
  712.     }
  713.  
  714. } // end uploaded
  715.  
  716.  
  717. function hotfile () {
  718.  
  719.     // these vars seem named in reverse, since we parse dlText for the timer-length
  720.     // but they are consistent with the id tags, set by hotfile. whatcanyado....
  721.     //var dlTimer = $id("dwltmr");
  722.     var downLoadLink = getFirstResult("//td/h3/a");
  723.     var freeButton = getFirstResult("//tr/td[3]/input");
  724.     var seconds = 0;
  725.     var time = 0;
  726.     var useSkipScreenTimer = true;
  727.  
  728.     // TODO: not working (as of ?? hotfile works as of August30, 2009)
  729.     if (freeButton) {
  730.         unsafeWindow.starttimer();
  731.     }
  732.  
  733.     var dlTimer = getFirstResult("//h3[@id='dwltxt']/text()"); // reached limit
  734.     var dlText = getFirstResult("//h3[@id='dwltmr']/span/text()"); // normal wait
  735.  
  736.     // the idea is to get whichever one is active (if either)
  737.     // and then treat them the same...
  738.     var informer;
  739.     if (dlText) {
  740.         informer = dlText.data;
  741.     } else if (dlTimer) {
  742.         informer = dlTimer.data;
  743.     }
  744.  
  745.     if ( informer ) {
  746.  
  747.         var minutes = informer.match(/(\d+) minute/);
  748.         if (minutes && (minutes.length == 2)) {
  749.             time = parseInt(minutes[1],10);
  750.             seconds = TOOLS.minutesToSeconds(time);
  751.         }
  752.  
  753.         var secs = informer.match(/(\d+) second/);
  754.         if (secs && (secs.length == 2)) {
  755.             time = parseInt(secs[1],10);
  756.             seconds = time;
  757.             // hotfile updates their own timer
  758.             // put two on-screen, and they're out of synch; ugly
  759.             useSkipScreenTimer = false;
  760.         }
  761.  
  762.         var ssMsg = "<p style='color:red'>HotFile.com is making you wait.</p>"
  763.             + "<p style='color:green'><strong>SkipScreen will automatically retry when the timer finishes.</strong></p>"
  764.             + "<p id='remaining'>Working...</p>"; // blank, becuase there is _already_ a timer on-screen....
  765.         prominence(ssMsg);
  766.  
  767.         var waiter = setInterval( function () {
  768.                        seconds--;
  769.                        if (seconds <= 0) {
  770.                          clearInterval(waiter);
  771.                          var rem = $id("remaining");
  772.                          if (rem) rem.innerHTML = "If your download doesn't proceed, please try again.";
  773.                          document.location = document.location;
  774.                          var sub = document.forms.f;
  775.                          if (sub) sub.submit();
  776.                        } else {
  777.                          var msg = TOOLS.formatSeconds(seconds) + " remaining to wait";
  778.                            document.title = "{SS} " + msg;
  779.                            if (useSkipScreenTimer) {
  780.                                // double-declaration in same scope...
  781.                                var rem = $id("remaining");
  782.                                if (rem) rem.innerHTML = msg;
  783.                            }
  784.                        }
  785.                      } , TOOLS.ONE_SECOND) ;
  786.  
  787.     }
  788.  
  789.     // this was the attempt to bypass the initial wait-period; was only working in the US, not internationally
  790. //     if (freeButton && unsafeWindow.starttimer) {
  791.  
  792. //      getFirstResult('//input[@name="tm"]').value = "1245203148" ;
  793. //      getFirstResult('//input[@name="waithash"]').value = "59a20bf8ffeeaa58a936237db169f35501a2227a";
  794. //      getFirstResult('//input[@name="tmhash"]').value = "81c710fba459fa7e5d350fdb693ff7751fa0ee6b";
  795.  
  796. //      document.forms.namedItem("f").submit();
  797.  
  798. //      return;
  799.  
  800. //     }
  801.  
  802.     if (downLoadLink) {
  803.         new share().show();
  804.         document.location.href = downLoadLink;
  805.     }
  806.  
  807. } // end hotfiles
  808.  
  809. // should only be in here if the path is exactly 6-chars
  810. function digg () {
  811.  
  812.     var dFrame = $id("diggiFrame");
  813.     if (dFrame) {
  814.         document.location.href = dFrame.src;
  815.     } else {
  816.         var ct = $id("skipscreen");
  817.         if (ct) {
  818.             var timer = setInterval( function () {
  819.                 clearInterval(timer);
  820.                 ct.style.display = "none";
  821.             }, 5000);
  822.         }
  823.     }
  824.  
  825. }
  826.  
  827.  
  828. // see megaupload.js -enternal file
  829.  
  830.  
  831. function limelinx () {
  832.  
  833.     // there are (at least) three main pages we're clicking on....
  834.  
  835.     logIt("limelink: entrance");
  836.  
  837.     var xpath = "//li[@id='DownloadLI']/a";
  838.     var urlLink = getFirstResult(xpath, document);
  839.  
  840.     if (urlLink) {
  841.         try {
  842.             logIt("limelinx: p1");
  843.             document.location = urlLink.href;
  844.         } catch(e) { errorHandler(e, twoLD); }
  845.  
  846.         return;
  847.  
  848.     }
  849.  
  850.     // second-phase
  851.     xpath = "/html/body/div[2]/p/a[@id='DownloadButton']";
  852.     //xpath = "/p/a[@id='DownloadButton']";
  853.     urlLink = getFirstResult(xpath,document);
  854.  
  855.     if (urlLink) {
  856.         logIt("limelinx: second-phase");
  857.  
  858.         document.location = urlLink.href;
  859.  
  860.         //return;
  861.  
  862.     } // I hope you're seeing a pattern, here...
  863.  
  864.     // third-phase
  865.  
  866.     xpath = "//a[@id='AdBriteSkipThisAd']";
  867.     urlLink = getFirstResult(xpath,document);
  868.  
  869.     if (urlLink) {
  870.  
  871.         logIt("limelinx: p3 intermission");
  872.  
  873.         // this needs to be a click....
  874.         document.ADBRITE.INTERMISSION.hide_intermission();
  875.         //document.location = urlLink.href;
  876.     }
  877.  
  878.     // fourth-phase
  879.  
  880.     xpath = "//p[@id='CountDownText']/a";
  881.     xpath = "/html/body/div[@class='Content' and position()=2]/p[@id='CountDownText']/a";
  882.     urlLink = getFirstResult(xpath,document);
  883.  
  884.     if (urlLink) {
  885.         logIt("limelinx: p4 countdown");
  886.         document.location = urlLink.href;
  887.     }
  888.  
  889.  
  890. }
  891.  
  892.  
  893. function divshare () {
  894.  
  895.     // TODO: this is weird, it should be AT THE END, not the begininng...
  896.     //new share().show();
  897.  
  898.     // there are three main pages we're clicking on....
  899.  
  900.     var xpath = "//div[2]/span/a[@class='action']";
  901.     var urlLink = getFirstResult(xpath, document);
  902.  
  903.     if (urlLink) {
  904.         try {
  905.             document.location = urlLink.href;
  906.         } catch(e) { errorHandler(e, twoLD); }
  907.  
  908.         return;
  909.  
  910.     }
  911.  
  912.     // second-phase
  913.     xpath = "//tr[2]/td/a[@class='action']";
  914.     urlLink = getFirstResult(xpath,document);
  915.  
  916.     if (urlLink) {
  917.         document.location = urlLink.href;
  918.  
  919.         return;
  920.  
  921.     } // I hope you're seeing a pattern, here...
  922.  
  923.     // third-phase
  924.  
  925.     xpath = "//tr/td[1]/div[1]/span[@class='icon_span']/a[@class='action']";
  926.     //  xpath = "//div/center[2]/div[1]/span[@class='icon_span']/a[@class='action']";
  927.     urlLink = getFirstResult(xpath,document);
  928.  
  929.     if (urlLink) {
  930.         new share().show();
  931.         document.location = urlLink.href;
  932.     }
  933.  
  934. }
  935.  
  936.  
  937. function linkbucks () {
  938.  
  939.     document.cookie="alerted=yes";
  940.  
  941.     var xpath = "//div[@id='lb_wrap']/a[2]";
  942.     var urlLink = getFirstResult(xpath, document);
  943.  
  944.     if (urlLink) {
  945.  
  946.         try {
  947.             document.location = urlLink.href;
  948.         } catch(e) { errorHandler(e, twoLD); }
  949.     }
  950.  
  951. }
  952.  
  953.  
  954. function sharebee () {
  955.  
  956.     // sharebee offers no direct downloads, so never displays the share-flag
  957.  
  958.     // this is untested, as I'm not getting these ads anymore....
  959.     // they so seldom appear
  960.     // leave it in, in case it shows up....
  961.     var urlLink = $id("AdBriteSkipThisAd");
  962.     if (urlLink) { // we're in an interstitial ad-page
  963.         try {
  964.             unsafeWindow.ADBRITE.INTERMISSION.hide_intermission();
  965.         } catch(e) { errorHandler(e, twoLD); }
  966.         return;
  967.     }
  968.  
  969.     // returns all the randomly-ordered links
  970.     var sb_xpath = "//table[@class='links']/tbody/tr/td/div/a";
  971.     var sb_table = document.evaluate(sb_xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  972.  
  973.     if (sb_table) {
  974.  
  975.         for (var i=0; i < sb_table.snapshotLength; i++) {
  976.             var target = sb_table.snapshotItem(i);
  977.  
  978.             var url = domainToArray(target.href);
  979.  
  980.             // select a known -- and working -- handler
  981.             // not prioritized -- just in order provided
  982.             // TODO: test links first, to see if they exist?
  983.             // or (easier) allow user to select priority....
  984.             var dom = getSecondLevelDomain(url);
  985.  
  986.             switch (dom) {
  987.             case 'depositfiles' :
  988.             case 'zshare' :
  989.                 document.location = target.href;
  990.                 break;
  991.             }
  992.  
  993.         }
  994.     }
  995.  
  996. }
  997.  
  998.  
  999. function zshare (aPath){
  1000.  
  1001.     if (aPath[1]=='audio') {
  1002.  
  1003.         // audio is handled differently, as it has a built-in player (for previews)
  1004.         // and maybe people want to listen, y'know?
  1005.  
  1006.         if (disabled("zshare_audio_")) { // if the _skipping_ is disabled
  1007.             var text = $id("contact-message");
  1008.             if (text) {text.innerHTML = "Audio Preview enabled; click \"Continue Skipping\" to download.";}
  1009.  
  1010.         // TODO: make this a clickable on-screen display
  1011.             var onward = getFirstResult("//tbody/tr[1]/td/div/table/tbody/tr/td[2]/a");
  1012.             if (onward) {onward.innerHTML = "<span style='color:green'>Continue Skipping!</span>";}
  1013.  
  1014.         } else {
  1015.  
  1016.             var audio_xpath = "//div/table/tbody/tr/td[2]/a";
  1017.             var urlLink = getFirstResult(audio_xpath, document);
  1018.  
  1019.             if (!urlLink) {return;} // either not audio, or not found
  1020.  
  1021.             document.location = urlLink.href;
  1022.         }
  1023.     } else { // we're not dealing with audio
  1024.  
  1025.         var dl_element = $id('download');
  1026.         if (dl_element && (dl_element.type != 'hidden') )  {// this is our download page
  1027.  
  1028.             // make a link appear "early"....
  1029. //             var easy_link = document.createElement("a");
  1030. //             easy_link.setAttribute("href", unsafeWindow.link); // also stored as array link_enc (single-chars)
  1031. //             easy_link.innerHTML = "<center><strong><span style='color:green'>zShare download link!</span></strong></center>";
  1032. //             var daddy = dl_element.parentNode;
  1033. //             daddy.appendChild(easy_link);
  1034.  
  1035.             // kill the timer
  1036.             //unsafeWindow.time = 0;
  1037.  
  1038.         var seconds = unsafeWindow.time;
  1039.  
  1040.             var endFunction = function(){ new share().show(); location.href = unsafeWindow.link; };
  1041.             genericWaiter(seconds, twoLD, endFunction);
  1042.  
  1043.  
  1044. //             new share().show();
  1045. //             document.location = unsafeWindow.link;
  1046.  
  1047.         } else if (dl_element) {
  1048.             // page that links to download page
  1049.             var form = document.forms.namedItem("form1");
  1050.             form.submit();
  1051.         }
  1052.     }
  1053.  
  1054. }
  1055.  
  1056.  
  1057.  
  1058. // somewhat working, but iffy
  1059. function sendspace() {
  1060.  
  1061.     // link, etc. is at bottom of screen....
  1062.     unsafeWindow.scrollTo(0,9999999);
  1063.  
  1064.     logIt("sendspace");
  1065.  
  1066.     // link will not appear until ads are loaded...
  1067.     var downloadLink = $id('downlink');
  1068.  
  1069.     if (downloadLink) {
  1070.         document.location = downloadLink.href;
  1071.     } else {
  1072.  
  1073.         addSharingScripts();
  1074.  
  1075.         var freedom = function () {
  1076.  
  1077.             var timer = setInterval( function () {
  1078.                 if (link_updated == 1) {
  1079.                     clearInterval(timer);
  1080.                     var downloadLink = document.getElementById('downlink');
  1081.                     if (downloadLink) {
  1082.                         new share().show();
  1083.                         document.location = downloadLink.href;
  1084.                     }
  1085.                 } }, 1000);
  1086.  
  1087.         };
  1088.  
  1089.         var noHassler = document.createElement("script");
  1090.         document.body.appendChild(noHassler).innerHTML = "(" + freedom + ")()";
  1091.  
  1092.     }
  1093.  
  1094. }
  1095.  
  1096. function mediafire () {
  1097.  
  1098.   var loc = document.location.href;
  1099.   if (loc.indexOf("mediafire.com/download.php") > -1) {
  1100.     document.location.href = loc.replace(/download\.php/, "");
  1101.     return;
  1102.   }
  1103.   // http://www.mediafire.com/file/4tjxjfz1tyw
  1104.   if (loc.indexOf("mediafire.com/file/") > -1) {
  1105.     document.location.href = loc.replace(/file\//, "?");
  1106.     return;
  1107.   }
  1108.  
  1109.     // changed on Nov 2, 2009
  1110.     var mf_xpath = "//div[@class='download_link' and not(@id='download_link')]/a";
  1111.     //var downloadLink = getFirstResult(mf_xpath, document);
  1112.     var downloadLink;
  1113.     var dl = $(".download_link[style*=block] > a"); // first use of jQuery selectors.....
  1114.     if (dl && dl[0] && dl[0].href) downloadLink = dl[0];
  1115.  
  1116.     if (downloadLink) {
  1117.  
  1118.         var opt_xpath = "//input[@id='p_ct_checkbox']";
  1119.         var checkbox_present = getFirstResult(opt_xpath, document);
  1120.         if (checkbox_present) {
  1121.  
  1122.             addSharingScripts();
  1123.  
  1124.             TOOLS.incrSkipCount();
  1125.             var cntr = document.createElement("script");
  1126.           document.body.appendChild(cntr).innerHTML = "function getCount() { return " + TOOLS.getSkipCount() + ";}";
  1127.  
  1128.         // the name "freedom" is an artifact of the pre-release product name "HassleFree"
  1129.             function freedom() {
  1130.  
  1131.                 prominence('Your SkipScreen download is starting...');
  1132.  
  1133.                 // weird variables names match code on the page
  1134.                 p_ct_link.href = p_ct_dl_url;
  1135.                 p_ct_link.target = '';
  1136.                 new share().soloShow();
  1137.                 document.location.href = p_ct_dl_url;
  1138.  
  1139.             }
  1140.  
  1141.             var noHassler = document.createElement("script");
  1142.             document.body.appendChild(noHassler).innerHTML = "(" + freedom + ")()";
  1143.  
  1144.         } else { // no checkbox present
  1145.  
  1146.         prominence('Your SkipScreen download is starting...');
  1147.             new share().show();
  1148.             document.location = downloadLink.href;
  1149.  
  1150.         }
  1151.  
  1152.     } // end downloadLink found
  1153.  
  1154. } // end MediaFire
  1155.  
  1156.  
  1157. function link_protector () {
  1158.  
  1159.     var xpath = "//form/input";
  1160.     var button = getFirstResult(xpath, document);
  1161.  
  1162.     if (button) {
  1163.         try {
  1164.             var content = button.wrappedJSObject.onclick;
  1165.             if (content) {
  1166.                 var reg = /.*"(.*)".*/;
  1167.                 var parse = reg.exec(content);
  1168.                 if (parse) {
  1169.                     var newLink = parse[1];
  1170.                     document.location = newLink;
  1171.                 }
  1172.             } else {
  1173.               var form = getFirstResult("//form");
  1174.                 if (form) {
  1175.                     form.submit();
  1176.                 }
  1177.             }
  1178.             // NOTE: there is no Share, because link-protector is an intermediary to other sites
  1179.         } catch(e) { errorHandler(e, twoLD); }
  1180.     }
  1181.  
  1182. }
  1183.  
  1184.  
  1185. function depositfiles () {
  1186.  
  1187.     // handles mp3s differently than other files
  1188.     var dfSubmit = function () {
  1189.         try {
  1190.             new share().show();
  1191.             link.submit();
  1192.         } catch(e) { errorHandler(e, twoLD); }
  1193.     };
  1194.  
  1195.     var xpath = "//td[2]/form";
  1196.     var link = getFirstResult(xpath, document);
  1197.  
  1198.     if (link) {
  1199.         // mp3-type download
  1200.         dfSubmit();
  1201.         return;
  1202.     }
  1203.  
  1204.     xpath = "//div[@id='download_url']/form";
  1205.     link = getFirstResult(xpath, document);
  1206.  
  1207.     if (link) {
  1208.         dfSubmit();
  1209.         return;
  1210.     }
  1211.  
  1212.     var already1 = getFirstResult("//body/p/text()");
  1213.     var already2 = getFirstResult("//div/p[1]/strong", document);
  1214.     var already = ( (already1 && already1.indexOf('You are trying to download') > -1)
  1215.                     || (already2 && already2.innerHTML.indexOf('already downloading') > -1) );
  1216.  
  1217.     if (already) {
  1218.  
  1219.         var concurrent = (already1 ? already1 : already2) ;
  1220.         var ssMsg = "<p style='color:red'>DepositFiles is making you wait.</p>"
  1221.             + "<p style='color:green'><strong>SkipScreen will automatically retry when the timer finishes.</strong></p>"
  1222.             + "<p id='remaining'>Preparing to skip</p>";
  1223.         //concurrent.appendChild(ssMsg);
  1224.         prominence(ssMsg);
  1225.  
  1226.         // wait for a minute (+- random amount), then try again....
  1227.         var seconds = 60 + TOOLS.randomOffset(20);
  1228.         var waiter = setInterval( function () {
  1229.                        --seconds;
  1230.                        if (seconds <= 0) {
  1231.                            clearInterval(waiter);
  1232.                            var rem = $id("remaining");
  1233.                            if (rem) rem.innerHTML = "If your download doesn't start, please try again.";
  1234.                            document.location = document.location;
  1235.                        } else {
  1236.                            var msg = TOOLS.formatSeconds(seconds) + " remaining until automatic retry.";
  1237.                            var rem = $id("remaining");
  1238.                            if (rem) rem.innerHTML = msg;
  1239.                        }
  1240.  
  1241.             }, TOOLS.ONE_SECOND );
  1242.         return;
  1243.     }
  1244.  
  1245.     var limit = getFirstResult("//div[@class='ipbg']/strong", document);
  1246.     if (limit && limit.innerHTML && limit.innerHTML.indexOf("used up your limit") > -1) {
  1247.  
  1248.         // may make us wait for minutes OR seconds...
  1249.  
  1250.         var time = 0;
  1251.         var seconds = 0;
  1252.  
  1253.         var minute = limit.innerHTML.match(/(\d+) minute/);
  1254.         if (minute && (minute.length == 2) ) {
  1255.             time = parseInt(minute[1],10);
  1256.             seconds = TOOLS.minutesToSeconds(time);
  1257.         }
  1258.  
  1259.         if (! minute) {
  1260.             var secs = limit.innerHTML.match(/(\d+) second/);
  1261.             if (secs && (secs.length == 2)) {
  1262.                 time = parseInt(secs[1],10);
  1263.                 seconds = time;
  1264.             }
  1265.         }
  1266.  
  1267.         var f = "<p style='color:red'>DepositFiles is making you wait.</p>"
  1268.             + "<p style='color:green'><strong>SkipScreen will automatically retry when the timer finishes.</strong></p>"
  1269.             + "<p id='remaining'>Preparing to skip</p>";
  1270.         //limit.appendChild(f);
  1271.         prominence(f);
  1272.  
  1273.         var waiter = setInterval( function () {
  1274.                        --seconds;
  1275.                        if (seconds <= 0) {
  1276.                            clearInterval(waiter);
  1277.                            var rem = $id("remaining");
  1278.                            if (rem) rem.innerHTML = "Preparing to Skip!";
  1279.                            document.location = document.location;
  1280.                        } else {
  1281.                            var msg = TOOLS.formatSeconds(seconds) + " remaining to wait";
  1282.                            document.title = "{SS} " + msg;
  1283.                            var rem = $id("remaining");
  1284.                            if (rem) rem.innerHTML = msg;
  1285.                        }
  1286.             } , 1000 ) ;
  1287.  
  1288.     } // end limit checks
  1289.  
  1290. } // end depositfiles
  1291.  
  1292.  
  1293. function rapidshare () {
  1294.  
  1295.   // trap for iframe issues
  1296. //  if (! document.body) return;
  1297.  
  1298.     // similar code, drills directly to the button....
  1299.     //   var freeBtn = getFirstResult("//input[@value='Free user']", document);
  1300.     //   if(freeBtn) freeBtn.click();   // auto-choose free button
  1301.     var freeForm = document.forms.namedItem("ff"); // is it accident, or design that selects "Free User" ?
  1302.     if (freeForm) {
  1303.         freeForm.submit();
  1304.         return;
  1305.     }
  1306.  
  1307.     var form = document.forms.namedItem("dlf");
  1308.     if (form) {
  1309.         new share().show();
  1310.         form.submit();
  1311.         return;
  1312.     }
  1313.  
  1314.     // if the above didn't work, you're gonna hafta wait.....
  1315.  
  1316.     addSharingScripts();
  1317.  
  1318.     var ssBanner = $id("contactText");
  1319.     var ssOrig;
  1320.     if (ssBanner) {
  1321.         ssOrig = ssBanner.innerHTML;
  1322.         ssBanner.innerHTML = "SkipScreen will download your file as soon as it is available!";
  1323.     }
  1324.  
  1325.     var wait = false;
  1326.  
  1327.     // grab filename for timer-display
  1328.     var fileName = location.pathname.split('/');
  1329.     fileName = fileName[fileName.length-1];
  1330.     var ssMsg = "<p style='color:red'>RapidShare is making you wait.</p>"
  1331.         + "<span style='color: green;'><strong>SkipScreen will automatically retry when the timer finishes.</strong></span>"
  1332.         + "<h2><span id='remaining'></span></h2>";
  1333.  
  1334.     // simple wait < 1 minute
  1335.     // TODO: if it's less than 1 minute, and the regex is looking for the word "minute"...
  1336.     // it won't find it? I don't think this _ever_ succeeds
  1337.     var verif = getFirstResult("//p[2]/b", document);
  1338.     if (verif && verif.innerHTML && verif.innerHTML.indexOf("minutes")> -1) {
  1339.         wait = (parseInt(verif.innerHTML.match(/(\d+) minutes/)[1], 10) * 60) + TOOLS.randomOffset(10);
  1340.         prominence(ssMsg);
  1341.     }
  1342.  
  1343.     // download limit has been reached; ~15 minutes wait
  1344.     if (!wait) {
  1345.         var limitWait = getFirstResult("//p[2]/text()", document);
  1346.         // TODO: hrrm.... what about... 1 minute to go?
  1347.         if (limitWait && limitWait.data && limitWait.data.indexOf("minutes") > -1 ) {
  1348.             wait = (parseInt(limitWait.data.match(/(\d+) minutes/)[1], 10) * 60) + TOOLS.randomOffset(10);
  1349.             prominence(ssMsg);
  1350.         }
  1351.     } // end !wait (15 minutes)
  1352.  
  1353.     if (!wait) {
  1354.         // are we already downloading in another tab?
  1355.         var already = getFirstResult("//p[2]/text()", document);
  1356.         if (already && already.data && already.data.indexOf("already downloading") > -1) {
  1357.             // wait (hopefully, download will be complete), and try again
  1358.             // randomize the waiting period, slightly to "hide" automation...
  1359.             wait = (2 * 60) + TOOLS.randomOffset(30) ;
  1360.             prominence(ssMsg);
  1361.         }
  1362.  
  1363.     }
  1364.     // NOTE: will probably have to wait 15 minutes, at that point... but now it is automated...
  1365.  
  1366.     if (!wait) {
  1367.         var expired = getFirstResult("//div/p[2]", document);
  1368.         if (expired && expired.innerHTML && expired.innerHTML.indexOf("session has expired") > -1) {
  1369.             var fresher = getFirstResult("//div[2]/div/p[2]/a", document);
  1370.             if (fresher) {document.location = fresher.href;}
  1371.         }
  1372.     }
  1373.  
  1374.     if (!wait) {
  1375.         var noSlots = getFirstResult("//div/p[3]/text()", document);
  1376.         if (noSlots && noSlots.data && noSlots.data.indexOf("no more download slots") > -1) {
  1377.             // wait (hopefully, download will be complete), and try again
  1378.             // randomize the waiting period, slightly to "hide" automation...
  1379.             wait = (2 * 60) + TOOLS.randomOffset(30) ;
  1380.             prominence(ssMsg);
  1381.         }
  1382.     }
  1383.  
  1384.     if (wait && (wait !== 0) ) {
  1385.         var seconds = wait;
  1386.  
  1387.         var waiter = setInterval( function() {
  1388.             --seconds;
  1389.  
  1390.             if (seconds <= 0) {
  1391.                 clearInterval(waiter);
  1392.                 var subst = document.createElement("form");
  1393.                 var inp = document.createElement("input");
  1394.                 inp.name = "dl.start";
  1395.                 inp.value = "Free";
  1396.                 subst.action = location.href;
  1397.                 subst.method = "post";
  1398.                 subst.appendChild(inp);
  1399.                 document.body.appendChild(subst);
  1400.                 subst.submit();
  1401.             } else {
  1402.                 var msg = TOOLS.formatSeconds(seconds) + " remaining";
  1403.                 document.title = "{SS} " + msg;
  1404.                 var remain = $id("remaining");
  1405.                 if (remain) remain.innerHTML = msg;
  1406.             }
  1407.         } , 1000 ) ;
  1408.  
  1409.     }
  1410.  
  1411.     else {
  1412.  
  1413.         // TODO: Skip if timer = 0 ??
  1414.         var rsScript = getFirstResult("//div[@id='inhaltbox']/script",document);
  1415.         if (rsScript) {
  1416.             var mins = rsScript.innerHTML.match(/c=(\d+)/);
  1417.             if (mins) {
  1418.                 wait = parseInt(mins[1], 10);
  1419.             }
  1420.         } else {
  1421.             var warning = $id("contact-message");
  1422.             if (warning) warning.innerHTML = "couldn't find skippable codes; click to download.";
  1423.             return; // quit entirely, because the file is not here (or some other error)
  1424.         }
  1425.  
  1426.         // now that we've captured the wait, set count to 0
  1427.         unsafeWindow.c = 0;
  1428.         if (unsafeWindow.fc) {unsafeWindow.fc = function () {return;};} // don't need the built-timer actions
  1429.  
  1430.         prominence(ssMsg);
  1431.  
  1432.         function smoothSailing() {
  1433.  
  1434.             var TOOLS = new SKIPSCREEN_TOOLS();
  1435.  
  1436.             // Returns null if expr didn't match anything
  1437.             function getFirstResult(expr, node){
  1438.                 // if no node provided, default to document
  1439.                 if (!node) {node = document;}
  1440.                 var result = document.evaluate(expr, node, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
  1441.                 return result.singleNodeValue;
  1442.             }
  1443.  
  1444.             var $id = function(id) { return document.getElementById(id); };
  1445.  
  1446.  
  1447.             var timer = setInterval( function() {   //start counter
  1448.                 wait--;
  1449.                 if (wait <= 0) {
  1450.                     clearInterval(timer);
  1451.                     document.title = "starting download! {SkipScreen}";
  1452.                     var ct = $id("contactText");
  1453.                     if (ct) {ct.innerHTML = 'SkipScreen bugs?  Ideas?  Screens that need skipping? <a href="http://getsatisfaction.com/skipscreen/">contact us!</a>';}
  1454.                     var prom = $id("prom");
  1455.                     if (prom) prom.style.display = "none";
  1456.                     new share().soloShow();
  1457.                     var dlf = getFirstResult("//form[@name='dlf']", document);
  1458.                     if (dlf) {dlf.submit();}
  1459.                 } else {
  1460.                     // display mirror selections
  1461.                     if ($id("p1")) $id("p1").style.display = "";
  1462.                     // and hide "download" button
  1463.                     var download = getFirstResult("//div[@id='dl']/form/center/input");
  1464.                     if (download) download.style.display = "none";
  1465.  
  1466.                     document.title = "{SS} " + (wait) + " " + fileName;
  1467.                     var remain = $id("remaining");
  1468.                     if (remain) remain.innerHTML = wait + " seconds left";
  1469.                 }
  1470.             },1000);
  1471.         } // end smoothSailing
  1472.  
  1473.         TOOLS.incrSkipCount();
  1474.         var cntr = document.createElement("script");
  1475.     document.body.appendChild(cntr).innerHTML = "function getCount() { return " + TOOLS.getSkipCount() + ";}";
  1476.  
  1477.         var wtvr = document.createElement("script");
  1478.         document.body.appendChild(wtvr).innerHTML = "var wait = " + wait + ";" ;
  1479.  
  1480.         var flvr = document.createElement("script");
  1481.         document.body.appendChild(flvr).innerHTML = "var fileName = '" + fileName + "';" ;
  1482.  
  1483.         var skipper = document.createElement("script");
  1484.         document.body.appendChild(skipper).innerHTML = "(" + smoothSailing + ")()";
  1485.  
  1486.     } // end final else condition
  1487.  
  1488. }
  1489.  
  1490. function share () {
  1491.  
  1492.     this.incrCount = function () {
  1493.         var TOOLS = new SKIPSCREEN_TOOLS();
  1494.         TOOLS.incrSkipCount();
  1495.     };
  1496.  
  1497.     this.getCount = function () {
  1498.         return TOOLS.getSkipCount();
  1499.     };
  1500.  
  1501.     this.getDate = function () {
  1502.         var dfault = Date();
  1503.         var first = new Date(GM_getValue("firstskipdate", dfault ));
  1504.         //return first.toLocaleDateString();
  1505. //     var curr_date = first.getDate();
  1506. //     var curr_month = first.getMonth();
  1507. //     curr_month++;
  1508. //     var curr_year = first.getFullYear();
  1509. //     return "" + curr_year + "/" + curr_month + "/" + curr_date;
  1510.     return this.formatDate(first);
  1511.     };
  1512.  
  1513.     this.formatDate = function(fdate) {
  1514.     if (!fdate) fdate = new Date();
  1515.     var curr_date = fdate.getDate();
  1516.     var curr_month = fdate.getMonth();
  1517.     curr_month++;
  1518.     var curr_year = fdate.getFullYear();
  1519.     return "" + curr_year + "/" + curr_month + "/" + curr_date;
  1520.     };
  1521.  
  1522.     // wrapper used when calling from page-embedded timers
  1523.     this.soloShow = function () {
  1524.     //        this.getCount = function() {return ssCount;}; // TODO: cookie-based
  1525.         this.getCount = function() {
  1526.         if (typeof getCount == 'undefined') {
  1527.         return 2;
  1528.         } else {
  1529.         return getCount();
  1530.         } }; // TODO: cookie-based
  1531.         this.incrCount = function() {return;}; // TODO: cookie-basedthis.incrCount = function() {
  1532. //        this.getDate = function() { return new Date().toLocaleDateString(); };
  1533.         this.getDate = function() { return this.formatDate(); };
  1534.         this.show();
  1535.     };
  1536.  
  1537.     this.show = function() {
  1538.  
  1539.         if (disabled("sharescreen")) {return;}
  1540.         addShareStyle();
  1541.  
  1542.         // promo-rotator iFrame source
  1543.         //var ssResource = 'http://www.SkipScreen.com/resources/ss-inside.html';
  1544.         var ssResource = 'http://www.SkipScreen.com/search/ss-inside.html?skipper';
  1545.  
  1546.         this.incrCount();
  1547.         var count = this.getCount();
  1548.  
  1549.         var shareText = makeElement('div', {id: 'SS-Share', style: 'display:none'} );
  1550.         shareText.innerHTML = '    <div id="top-bar">'
  1551.  
  1552.             + '    <div id="top-bar-right">'
  1553.             + '     <a href="http://getsatisfaction.com/skipscreen/">Bugs? Suggestions?</a>'
  1554.             + '    </div>'
  1555.  
  1556.             + '    <div id="top-bar-left">'
  1557.             + '     <a href="#" id="close-box">← Close post-download</a>'
  1558.             + '    </div>'
  1559.  
  1560.             + '    <div id="top-bar-center">'
  1561.             + '     <strong><a href="http://www.skipscreen.com">SkipScreen</a></strong>'
  1562.             + '     has helped download more than ' + count + ' files since ' + this.getDate()
  1563.             + '    </div>'
  1564.  
  1565.             + '   </div>'
  1566.  
  1567.             + '   <div id="mainContent">'
  1568.  
  1569.             + ' <div style="clear: both;"></div>'
  1570.  
  1571.             + ' <div id="bottom-section">'
  1572.             + '       <div id="rotator">'
  1573. //            + '         <iframe name="ssPromo" id="ssPromo" width="800" height="580" src="' + ssResource + '"'
  1574.             + '         <iframe name="ssPromo" id="ssPromo" width="800" height="680" src="' + ssResource + '"'
  1575.             + '         frameborder="0" scrolling="no"></iframe>'
  1576.             + '       </div>'
  1577.             + '     </div>'
  1578.  
  1579.             + '   </div>'
  1580.  
  1581.             + '   <div id="footer-bar">'
  1582.             + ' psyched about skipscreen?'
  1583.             + ' tell a friend about SkipScreen on '
  1584.             + '<a href="http://www.facebook.com/sharer.php?u=http://www.SkipScreen.com?t=Iskp that Isht" target="_blank">Facebook</a> '
  1585.             + 'or <a href="http://twitter.com/home?status=I+use+the+SkipScreen+%23FirefoxExtension+to+speed+my+downloads%3A+http%3A%2F%2Fwww.SkipScreen.com" target="_blank" >Twitter.</a>'
  1586.             + '   </div>'
  1587.  
  1588.         ;
  1589.  
  1590.  
  1591.         document.body.appendChild(shareText);
  1592.  
  1593.         var closeit = function () {document.getElementById('SS-Share').style.display = "none";
  1594.                                    document.getElementById("skipscreen").style.display = "block"; };
  1595.  
  1596.  
  1597.         var cb = document.getElementById("close-box");
  1598.         if (cb) {cb.addEventListener('click', closeit, false);}
  1599.  
  1600.         setTimeout ( function () { document.getElementById("skipscreen").style.display = "none";
  1601.                                    document.getElementById("SS-Share").style.display = "block";
  1602.                                    $id('ssPromo').src = ssResource;  // refresh to force display
  1603.                    } , 500 ); // two seconds averages out to be around the dl time w/ server differences
  1604.  
  1605.     }; // end this.show
  1606.  
  1607. } //end var share
  1608.  
  1609.  
  1610. function addShareStyle() {
  1611.     // Append CSS
  1612.     addHeaderCode('style', 'text/css',
  1613.                   '#SS-Share {'
  1614.                   +      'font-family: helvetica, sans-serif;'
  1615.                   +      'font-size: 14px;'
  1616.                   +      'background-color: white;'
  1617. //                  +      'opacity: 0.9;'
  1618.                   +      'margin: 0;'
  1619.                   +      'padding: 0;'
  1620. //                  +      'position: fixed;'
  1621.                   +      'position: absolute;'
  1622.                   +      'top: 0;'
  1623.                   +      'left: 0;'
  1624.                   +      'top: 0;'
  1625.                   +      'left: 0;'
  1626.                   +      'width: 100%;'
  1627.                   +      'height: 780px;'
  1628.                   +      'z-index: 9999999;'
  1629.                   + '}'
  1630.  
  1631.                   + '#top-bar {'
  1632.                   +     'width: 100%;'
  1633.                   +     'background-color: #393;'
  1634.                   +     'color: white;'
  1635.                   +     'height: 44px;'
  1636.                   +     'line-height: 14px;'
  1637.                   + '}'
  1638.  
  1639.                   + '#top-bar-left {'
  1640.                   +     'float: left;'
  1641.                   +     'padding: 15px;'
  1642.                   + '}'
  1643.  
  1644.                   + '#top-bar-center {'
  1645.                   +     'width: 500px;'
  1646.                   +     'margin: 0 auto 0 auto;'
  1647.                   +     'padding: 15px;'
  1648.                   +     'text-align: center;'
  1649.                   + '}'
  1650.  
  1651.                   + '#top-bar-right {'
  1652.                   +     'float: right;'
  1653.                   +     'padding: 15px; '
  1654.                   + '}'
  1655.  
  1656.                   + '#top-bar a, top-bar a:visited {'
  1657.                   +     'color: white;'
  1658.                   + '}'
  1659.  
  1660.  
  1661.                   + '#mainContent {'
  1662.                   +     ''
  1663.                   +     'width: 650px;'
  1664.                   +     'margin: 0px auto 0px auto;'
  1665.                   +     'color: #444;'
  1666.                   +     'line-height: 1.7em;'
  1667.                   +     'position: relative;'
  1668.                   +     ''
  1669.                   + '}'
  1670.  
  1671.                   + 'a img {'
  1672.                   +     'border: none;'
  1673.                   + '}'
  1674.  
  1675.                   + 'a, a:visited {'
  1676.                   +     'color: #333;'
  1677.                   + '}'
  1678.  
  1679.                   + '#top-section {'
  1680.                   +     'text-align: center;'
  1681.                   +     'font-size: 15px;'
  1682.                   +     'padding: 40px;'
  1683.                   +     'color: #555;'
  1684.                   + '}'
  1685.  
  1686.                   + '#top-section a, #top-section a:visited {'
  1687.                   +     'color: #555;'
  1688.                   + '}'
  1689.  
  1690.                   + 'h3 {'
  1691.                   +     'font-size: 18px;'
  1692.                   +     'padding: 0;'
  1693.                   +     'margin: 0;'
  1694.                   +     'font-weight: normal;'
  1695.                   +     'text-align: center;'
  1696.                   +     'color: #000;'
  1697.                   + '}'
  1698.  
  1699.                   + '.small-text {'
  1700.                   +     'color: #888;'
  1701.                   +     'font-size: 12px;'
  1702.                   + '}'
  1703.  
  1704.                   + '.small-white {'
  1705.                   +     'color: #ded;'
  1706.                   +     'font-size: 10px;'
  1707.                   +     'padding-top: 7px;'
  1708.                   + '}'
  1709.  
  1710.  
  1711.                   + 'p {'
  1712.                   +     'margin: 0px 0 14px 30px;'
  1713.                   + '}'
  1714.  
  1715.  
  1716.                   + '#top-left {'
  1717.                   +     'margin:  10px 0 0 0px;'
  1718.                   +     'font-size: 15px;'
  1719.                   +     'width: 220px;'
  1720.                   +     'float: left;'
  1721.                   + '}'
  1722.  
  1723.                   + '.section-topper {'
  1724.                   +     'padding: 5px 5px 5px 0px;'
  1725.                   +     'line-height: 15px;'
  1726.                   +     'font-size: 15px;'
  1727.                   +     'color: white;'
  1728.                   + '}'
  1729.                   + '.section-topper strong {'
  1730.                   +     'color: black;'
  1731.                   + '}'
  1732.  
  1733.                   + 'ul {'
  1734.                   +     'margin: 0;'
  1735.                   +     'padding: 0;'
  1736.                   +     'list-style-type: none;'
  1737.                   + '}'
  1738.  
  1739.                   + 'li {'
  1740.                   +     'padding: 5px;'
  1741.                   +     'margin: 0;'
  1742.                   +     'line-height: 15px;'
  1743.                   +     'color: white;'
  1744.                   + '}'
  1745.  
  1746.                   + 'li:hover {'
  1747.                   +     'color: #333;'
  1748.                   +     'background-color: #dfd;'
  1749.                   + '}'
  1750.  
  1751.                   + 'li a, li a:visited {'
  1752.                   + '}'
  1753.  
  1754.                   + '#top-middle {'
  1755.                   +     'margin:  10px 0 0 20px;'
  1756.                   +     'font-size: 13px;'
  1757.                   +     'width: 340px;'
  1758.                   +     'float: left;'
  1759.                   +     'color: #666;'
  1760.                   + '}'
  1761.  
  1762.                   + '#top-middle a, #top-middle a:visited {'
  1763.                   +     'color: #666;'
  1764.  
  1765.                   + '}'
  1766.  
  1767.                   + 'input {'
  1768.                   +     'padding: 3px;'
  1769.                   +     'font-size: 13px;'
  1770.                   + '}'
  1771.  
  1772.                   + '#top-right {'
  1773.                   +     'margin:  30px 0 0 0px;'
  1774.                   +     'width: 20px;'
  1775.                   +     'float: left;'
  1776.                   +     'background-color: #fff;'
  1777.                   + '}'
  1778.  
  1779.  
  1780.                   + '#quotes {'
  1781.                   +     'color: #ca2f05;'
  1782.                   + '}'
  1783.  
  1784.                   + '#bottom-section {'
  1785.                   +     'padding: 40px 24px 0 0px;'
  1786.                   +     'margin: 0px 0 0px 0;'
  1787.                   +     'height: 100%;'
  1788.                   + '}'
  1789.  
  1790.  
  1791.                   + '#footer-bar {'
  1792.                   +      'width: 100%;'
  1793.                   +      'background-color: #393;'
  1794.                   +      'color: white;'
  1795.                   +      'height: 14px;'
  1796.                   +      'line-height: 14px;'
  1797.                   +      'padding: 15px 0 15px 0;'
  1798.                   +      'text-align: center;'
  1799.                   +      'margin: 0;'
  1800.                   +      'position: absolute;'
  1801.                   +      'bottom: 0px;'
  1802.                   + '}'
  1803.  
  1804.                   + '#footer-bar a, #footer-bar a:visited {'
  1805.                   +     'color: white;'
  1806.                   + '}'
  1807.  
  1808.                  );
  1809.  
  1810. }
  1811.  
  1812. // add all scripts need for running sharing-code directly on page
  1813. function addSharingScripts () {
  1814.  
  1815.     addHeaderCode('script', null, share, {language: 'javascript' });
  1816.     addHeaderCode('script', null, prominence, {language: 'javascript' });
  1817.     addHeaderCode('script', null, SKIPSCREEN_TOOLS, {language: 'javascript' });
  1818.     addHeaderCode('script', null, $id, { language: 'javascript' });
  1819.     addHeaderCode('script', null, makeElement, { language: 'javascript' });
  1820.     addHeaderCode('script', null, addHeaderCode, { language: 'javascript' });
  1821.     addHeaderCode('script', null, addShareStyle, { language: 'javascript' });
  1822.     // becuase sharescreen (the post-download page) can be disabled, and the disabled check is GM-only
  1823.     // we need to add the function as a pre-coded check when adding to page context
  1824.     addHeaderCode('script', null, 'function disabled() { return ' + disabled('sharescreen') + '; } ', {language: 'javascript' });
  1825.  
  1826. }
  1827.  
  1828. // put contact-info on managed pages
  1829. function addContactInfo(optionalMessage) {
  1830.  
  1831.     if (window != top) {return;}
  1832.  
  1833.     logIt("adding contact info: " + document.location);
  1834.  
  1835.     // ensure only one instance added to page (to prevent clone-stacking)
  1836.     var alreadyExists = getFirstResult("//div[@id='skipscreen']", document);
  1837.     if (alreadyExists) {return;}
  1838.  
  1839.     var contactLink = "http://getsatisfaction.com/skipscreen/";
  1840.     var message = optionalMessage ? optionalMessage : "SkipScreen bugs?  Ideas?  Screens that need skipping?";
  1841.  
  1842.     // create main div
  1843.     var contactBody= makeElement('div', {id: "skipscreen", 'class': 'msgbox' });
  1844.     var anchor = makeElement('a', {href: "#", title: "close SkipScreen info", 'class': 'closer' });
  1845.     anchor.innerHTML = "x";
  1846.  
  1847.     var removeContact = function () {document.getElementById('skipscreen').style.display = "none"; };
  1848.     anchor.addEventListener('click', removeContact, false);
  1849.  
  1850.     var contactText = document.createElement('p');
  1851.     //'SkipScreen bugs?  Ideas?  Screens that need skipping? <a href="http://getsatisfaction.com/skipscreen/">contact us!</a>'
  1852.     message = '<span id="contact-message">' + message + '</span>';
  1853.     contactText.innerHTML = message + " <a href='" + contactLink + "'>contact us!</a>";
  1854.     contactText.id = 'contactText';
  1855.  
  1856.     contactBody.appendChild(anchor);
  1857.     contactBody.appendChild(contactText);
  1858.  
  1859.     // Append Divs
  1860.     var objBody = document.getElementsByTagName("body")[0];
  1861.     // exit if no body -- some weird errors...
  1862.     if (objBody) {objBody.appendChild(contactBody);}
  1863.  
  1864.     // Append CSS
  1865.      var contactCSS = '.msgbox {'
  1866.         + 'position: fixed;'
  1867.         + 'z-index: 9999999;'
  1868.         + 'bottom: 0px;'
  1869.         + 'left: 0px;'
  1870.         + 'background: #C8FFCA;'
  1871.         + 'opacity: 0.8;'
  1872.         + 'color: #008000;'
  1873.         + 'border: 1px solid #349534;'
  1874.         + 'text-align: left;'
  1875.         + 'font-size: 11px;'
  1876.         + 'font-family: verdana;'
  1877.         + 'font-weight: bold; }'
  1878.  
  1879.         + '.msgbox p {'
  1880.         + 'margin: 0;'
  1881.         + 'padding: 5px 10px; '
  1882.         + 'float: left;'
  1883.         + 'max-width: 97%;'
  1884.         + '}\n'
  1885.  
  1886.         + '.msgbox a {'
  1887.         + 'color: #000;'
  1888.         + '}\n'
  1889.  
  1890.         + '.msgbox a.closer {'
  1891.         + 'float: right;'
  1892.         + 'text-decoration: none;'
  1893.         + 'font-weight: bold;'
  1894.         + 'color: #fff;'
  1895.         + 'background-color: #000;'
  1896.         + 'border-left: 1px solid #333;'
  1897.         + 'border-bottom: 1px solid #333;'
  1898.         + 'line-height: 9px;'
  1899.         + 'padding: 0 2px 1px;'
  1900.         + 'margin-left: 2px; }';
  1901.  
  1902.     GM_addStyle(contactCSS);
  1903.  
  1904. } // addContactInfo
  1905.  
  1906.  
  1907. function start () {
  1908.  
  1909.     TOOLS = new SKIPSCREEN_TOOLS();
  1910.     var url = "" + document.location;
  1911.     var aDomain = domainToArray(url);
  1912.  
  1913.     twoLD = getSecondLevelDomain(aDomain);
  1914.  
  1915.     logIt("SkipScreen: " + twoLD );
  1916.  
  1917.     // some servers (linkbucks, for now) fall under the same preference and handler function
  1918.     var maskTwoLD = getMask(twoLD);
  1919.  
  1920.     // basic check activation prefs
  1921.     if (disabled(maskTwoLD)) {return;}
  1922.  
  1923.     addContactInfo();
  1924.  
  1925.     switch( maskTwoLD ) {
  1926.  
  1927.     case 'depositfiles'    : depositfiles    () ; break;
  1928.     case 'digg'            : digg            () ; break;
  1929.     case 'divshare'        : divshare        () ; break;
  1930.     case 'fourshared'      : fourshared      () ; break;
  1931.     case 'hotfile'         : hotfile         () ; break;
  1932.     case 'limelinx'        : limelinx        () ; break;
  1933.     case 'link-protector'  : link_protector  () ; break;
  1934.     case 'linkbucks'       : linkbucks       () ; break;
  1935.     case 'mediafire'       : mediafire       () ; break;
  1936.     case 'megaupload'      : megaupload      () ; break;
  1937.     case 'rapidshare'      : rapidshare      () ; break;
  1938.     case 'sendspace'       : sendspace       () ; break;
  1939.     case 'sharebee'        : sharebee        () ; break;
  1940.     case 'storage'         : storage         () ; break;
  1941.     case 'uploaded'        : uploaded        () ; break;
  1942.     case 'filestube'       : filestube       () ; break;
  1943.     case 'zshare'          : zshare          (pathSplit(location.pathname) ) ; break;
  1944.  
  1945.     case 'netload'         : netload         () ; break;
  1946.  
  1947.     }
  1948.  
  1949. }
  1950.  
  1951. start();
  1952.  
  1953.  
  1954. // MUST HAVE TRAILING SEMI-COLONG FOR GM-COMPILER
  1955. ;
  1956.